热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

租户|中将_SpringCloudAlibaba微服务组件Nacos配置中心

篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudAlibaba微服务组件Nacos配置中心相关的知识,希望对你有一定的参考价值。1.N

篇首语:本文由编程笔记#小编为大家整理,主要介绍了SpringCloudAlibaba微服务组件Nacos配置中心相关的知识,希望对你有一定的参考价值。



1. Nacos配置中心使用

官方文档: https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。


1.1 快速开始

准备配置,nacos server中新建nacos-config.properties


1.2 搭建nacos-config服务

通过 Nacos Server 和 spring-cloud-starter-alibaba-nacos-config 实现配置的动态变更
1)引入依赖

<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>

2&#xff09;添加bootstrap.properties

spring.application.name&#61;nacos-config
# 配置中心地址
spring.cloud.nacos.config.server-addr&#61;127.0.0.1:8848
# dataid 为 yaml 的文件扩展名配置方式
# &#96;$spring.application.name.$file-extension:properties&#96;
spring.cloud.nacos.config.file-extension&#61;yaml
#profile粒度的配置 &#96;$spring.application.name-$profile.$file-extension:properties&#96;

3)启动服务&#xff0c;测试微服务是否使用配置中心的配置

&#64;SpringBootApplication
public class NacosConfigApplication
public static void main(String[] args)
ConfigurableApplicationContext applicationContext &#61; SpringApplication.run(NacosConfigApplication.class, args);
String userName &#61; applicationContext.getEnvironment().getProperty("common.name");
String userAge &#61; applicationContext.getEnvironment().getProperty("common.age");
System.out.println("common name :"&#43;userName&#43;"; age: "&#43;userAge);



1.3 Config相关配置

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串&#xff0c;公共命名空间&#xff08;public&#xff09;&#xff0c;分组默认是 DEFAULT_GROUP

支持配置的动态更新

&#64;SpringBootApplication
public class NacosConfigApplication
public static void main(String[] args) throws InterruptedException
ConfigurableApplicationContext applicationContext &#61; SpringApplication.run(NacosConfigApplication.class, args);
while(true)
//当动态配置刷新时&#xff0c;会更新到 Enviroment中&#xff0c;因此这里每隔一秒中从Enviroment中获取配置
String userName &#61; applicationContext.getEnvironment().getProperty("common.name");
String userAge &#61; applicationContext.getEnvironment().getProperty("common.age");
System.err.println("common name :" &#43; userName &#43; "; age: " &#43; userAge);
TimeUnit.SECONDS.sleep(1);



支持profile粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候&#xff0c;不仅仅加载了以 dataid 为 $spring.application.name.$file-extension:properties为前缀的基础配置&#xff0c;还加载了dataid为 $spring.application.name-$profile.$file-extension:properties的基础配置。在日常开发中如果遇到多套环境下的不同配置&#xff0c;可以通过Spring 提供的$spring.profiles.active 这个配置项来配置。

spring.profiles.active&#61;dev

支持自定义 namespace 的配置
用于进行租户粒度的配置隔离。不同的命名空间下&#xff0c;可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离&#xff0c;例如开发测试环境和生产环境的资源&#xff08;如配置、服务&#xff09;隔离等。
在没有明确指定$spring.cloud.nacos.config.namespace配置的情况下&#xff0c; 默认使用的是 Nacos 上 Public 这个namespace。如果需要使用自定义的命名空间&#xff0c;可以通过以下配置来实现&#xff1a;

spring.cloud.nacos.config.namespace&#61;71bb9785-231f-4eca-b4dc-6be446e12ff8

支持自定义 Group 的配置
Group是组织配置的维度之一。通过一个有意义的字符串&#xff08;如 Buy 或 Trade &#xff09;对配置集进行分组&#xff0c;从而区分 Data ID 相同的配置集。当您在 Nacos 上创建一个配置时&#xff0c;如果未填写配置分组的名称&#xff0c;则配置分组的名称默认采用 DEFAULT_GROUP 。配置分组的常见场景&#xff1a;不同的应用或组件使用了相同的配置类型&#xff0c;如 database_url 配置和 MQ_topic 配置。
在没有明确指定 $spring.cloud.nacos.config.group 配置的情况下&#xff0c;默认是DEFAULT_GROUP 。如果需要自定义自己的 Group&#xff0c;可以通过以下配置来实现&#xff1a;

spring.cloud.nacos.config.group&#61;DEVELOP_GROUP

支持自定义扩展的 Data Id 配置
Data ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集&#xff0c;每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包&#xff08;如 com.taobao.tc.refund.log.level&#xff09;的命名规则保证全局唯一性。此命名规则非强制。
通过自定义扩展的 Data Id 配置&#xff0c;既可以解决多个应用间配置共享的问题&#xff0c;又可以支持一个应用有多个配置文件。

# 自定义 Data Id 的配置
#不同工程的通用配置 支持共享的 DataId
spring.cloud.nacos.config.sharedConfigs[0].data-id&#61; common.yaml
spring.cloud.nacos.config.sharedConfigs[0].group&#61;REFRESH_GROUP
spring.cloud.nacos.config.sharedConfigs[0].refresh&#61;true
# config external configuration
# 支持一个应用多个 DataId 的配置
spring.cloud.nacos.config.extensionConfigs[0].data-id&#61;ext-config-common01.properties
spring.cloud.nacos.config.extensionConfigs[0].group&#61;REFRESH_GROUP
spring.cloud.nacos.config.extensionConfigs[0].refresh&#61;true
spring.cloud.nacos.config.extensionConfigs[1].data-id&#61;ext-config-common02.properties
spring.cloud.nacos.config.extensionConfigs[1].group&#61;REFRESH_GROUP

1.4 配置的优先级

Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。


  • A: 通过 spring.cloud.nacos.config.shared-configs 支持多个共享 Data Id 的配置
  • B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
  • C: 通过内部相关规则(应用名、应用名&#43; Profile )自动生成相关的 Data Id 配置

当三种方式共同使用时&#xff0c;他们的一个优先级关系是:A 优先级从高到低&#xff1a;
1)nacos-config-product.yaml 精准配置
2)nacos-config.yaml 同工程不同环境的通用配置
3)ext-config: 不同工程 扩展配置
4)shared-dataids 不同工程通用配置


1.5 &#64;RefreshScope

&#64;Value注解可以获取到配置中心的值&#xff0c;但是无法动态感知修改后的值&#xff0c;需要利用&#64;RefreshScope注解
&#64;RestController
&#64;RefreshScope
public class TestController

&#64;Value("$common.age")
private String age;
&#64;GetMapping("/common")
public String hello()
return age;

2. Nacos配置中心源码分析

https://www.processon.com/view/link/603f3d2fe401fd641adb51f1


2.1 配置中心的架构

配置中心使用demo

public class ConfigServerDemo
public static void main(String[] args) throws NacosException, InterruptedException
String serverAddr &#61; "localhost";
String dataId &#61; "nacos-config-demo.yaml";
String group &#61; "DEFAULT_GROUP";
Properties properties &#61; new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);
//获取配置服务
ConfigService configService &#61; NacosFactory.createConfigService(properties);
//获取配置
String content &#61; configService.getConfig(dataId, group, 5000);
System.out.println(content);
//注册监听器
configService.addListener(dataId, group, new Listener()
&#64;Override
public void receiveConfigInfo(String configInfo)
System.out.println("&#61;&#61;&#61;recieve:" &#43; configInfo);

&#64;Override
public Executor getExecutor()
return null;

);
//发布配置
//boolean isPublishOk &#61; configService.publishConfig(dataId, group, "content");
//System.out.println(isPublishOk);
//发送properties格式
configService.publishConfig(dataId,group,"common.age&#61;30", ConfigType.PROPERTIES.getType());
Thread.sleep(3000);
content &#61; configService.getConfig(dataId, group, 5000);
System.out.println(content);
// boolean isRemoveOk &#61; configService.removeConfig(dataId, group);
// System.out.println(isRemoveOk);
// Thread.sleep(3000);
// content &#61; configService.getConfig(dataId, group, 5000);
// System.out.println(content);
// Thread.sleep(300000);



2.2 nacos config client源码分析

配置中心核心接口ConfigService


2.2.1 获取配置

获取配置的主要方法是 NacosConfigService 类的 getConfig 方法&#xff0c;通常情况下该方法直接从本地文件中取得配置的值&#xff0c;如果本地文件不存在或者内容为空&#xff0c;则再通过 HTTP GET 方法从远端拉取配置&#xff0c;并保存到本地快照中。当通过 HTTP 获取远端配置时&#xff0c;Nacos 提供了两种熔断策略&#xff0c;一是超时时间&#xff0c;二是最大重试次数&#xff0c;默认重试三次。


2.2.2 注册监听器

配置中心客户端会通过对配置项注册监听器达到在配置项变更的时候执行回调的功能。

NacosConfigService#getConfigAndSignListener
ConfigService#addListener

Nacos 可以通过以上方式注册监听器&#xff0c;它们内部的实现均是调用 ClientWorker 类的 addCacheDataIfAbsent。其中 CacheData 是一个维护配置项和其下注册的所有监听器的实例&#xff0c;所有的 CacheData 都保存在 ClientWorker 类中的原子 cacheMap 中&#xff0c;其内部的核心成员有&#xff1a;


2.2.3 配置长轮询

ClientWorker 通过其下的两个线程池完成配置长轮询的工作&#xff0c;一个是单线程的 executor&#xff0c;每隔 10ms 按照每 3000 个配置项为一批次捞取待轮询的 cacheData 实例&#xff0c;将其包装成为一个 LongPollingTask 提交进入第二个线程池 executorService 处理。


2.3 nacos config server源码分析


2.3.1 配置dump

服务端启动时就会依赖 DumpService 的 init 方法&#xff0c;从数据库中 load 配置存储在本地磁盘上&#xff0c;并将一些重要的元信息例如 MD5 值缓存在内存中。服务端会根据心跳文件中保存的最后一次心跳时间&#xff0c;来判断到底是从数据库 dump 全量配置数据还是部分增量配置数据&#xff08;如果机器上次心跳间隔是 6h 以内的话&#xff09;。

全量 dump 当然先清空磁盘缓存&#xff0c;然后根据主键 ID 每次捞取一千条配置刷进磁盘和内存。增量 dump 就是捞取最近六小时的新增配置&#xff08;包括更新的和删除的&#xff09;&#xff0c;先按照这批数据刷新一遍内存和文件&#xff0c;再根据内存里所有的数据全量去比对一遍数据库&#xff0c;如果有改变的再同步一次&#xff0c;相比于全量 dump 的话会减少一定的数据库 IO 和磁盘 IO 次数。


2.3.2 配置发布

发布配置的代码位于 ConfigController#publishConfig中。集群部署&#xff0c;请求一开始也只会打到一台机器&#xff0c;这台机器将配置插入mysql中进行持久化。服务端并不是针对每次配置查询都去访问 MySQL &#xff0c;而是会依赖 dump 功能在本地文件中将配置缓存起来。因此当单台机器保存完毕配置之后&#xff0c;需要通知其他机器刷新内存和本地磁盘中的文件内容&#xff0c;因此它会发布一个名为 ConfigDataChangeEvent 的事件&#xff0c;这个事件会通过 HTTP 调用通知所有集群节点&#xff08;包括自身&#xff09;&#xff0c;触发本地文件和内存的刷新。


2.3.3 处理长轮询

客户端会有一个长轮询任务&#xff0c;拉取服务端的配置变更&#xff0c;服务端处理逻辑在LongPollingService类中&#xff0c;其中有一个 Runnable 任务名为ClientLongPolling&#xff0c;服务端会将受到的轮询请求包装成一个 ClientLongPolling 任务&#xff0c;该任务持有一个 AsyncContext 响应对象&#xff0c;通过定时线程池延后 29.5s 执行。比客户端 30s 的超时时间提前 500ms 返回是为了最大程度上保证客户端不会因为网络延时造成超时。


推荐阅读
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
author-avatar
小胖菜鸟
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有